﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

//int main()
//{
//	int n = 12;
//	int m = n << 1;
//	//左移 ---  移动的二进制序列
//	//00000000 00000000 00000000 00001100
//	//00000000 00000000 00000000 00011000
//	printf("%d\n", m);
//	printf("%d\n", n);
//	return 0;
//}

//int main()
//{
//	int n = 10;
//	int m = n << 1;
//	printf("%d\n", n);
//	printf("%d\n", m);
//	return 0;
//}

//int main()
//{
//	int a = -10;
//	int b = a << 1;
//	int c = a << 2;
//	//10000000 00000000 00000000 00001010
//	//补码：
//	//11111111 11111111 11111111 11110110
//	//左移：
//	//11111111 11111111 11111111 11101100 --- b在内存中的补码
//	//10000000 00000000 00000000 00010100
//	printf("%d\n", a);
//	printf("%d\n", b);
//	printf("%d\n", c);
//	return 0;
//}

//int main()
//{
//	int a = -10;
//	int b = a << 1;
//	int c = a << 2;
//	printf("%d\n", b);
//	//10000000 00000000 00000000 00001010
//	//11111111 11111111 11111111 11110110 --补码
//	//<<1
//	//11111111 11111111 11111111 11101100 
//	//10000000 00000000 00000000 00010100 --20
//	//<<2
//	//11111111 11111111 11111111 11011000
//    //10000000 00000000 00000000 00101000 --40
//
//	printf("%d\n", c);
//	return 0;
//}

//右移
//int main()
//{
//	int a = -10;
//	int b = a >> 1;
//	int c = a >> 2;
//	int d = a >> 3;
//	//10000000 00000000 00000000 00001010
//	//11111111 11111111 11111111 11110110  --- 补码
//	//11111111 11111111 11111111 11111011  
//	//10000000 00000000 00000000 00000101 -- -5
//	//右移到底是算数右移还是逻辑右移，是取决于编译器，但是大部分编译其采用的都是算术右移
//	printf("%d\n", a);
//	printf("%d\n", b);
//	printf("%d\n", c);
//	printf("%d\n", d);
//
//	return 0;
//}

//位操作符
//int main()
//{
//	int a = -5;
//	int b = 13;
//	int c = a & b;
//	int d = a | b;
//	int e = a ^ b;
//	int f = ~a;
//
//	//a:10000000 00000000 00000000 00000101
//	//a:11111111 11111111 11111111 11111011  -5补码
//	//b:00000000 00000000 00000000 00001101  13补码
//	//  00000000 00000000 00000000 00001001    & 9
//	//  11111111 11111111 11111111 11111111    | 
//	//  10000000 00000000 00000000 00000001
//	//  11111111 11111111 11111111 11110110     ^
//	//  10000000 00000000 00000000 00001010
//	//  00000000 00000000 00000000 00000100     ~
//	printf("%d\n", c);
//	printf("%d\n", d);
//	printf("%d\n", e);
//	printf("%d\n", f);
//
//	return 0;
//}

//int main()
//{
//	int a = 0;
//	//00000000 00000000 0000000 00000000
//	//11111111 11111111 1111111 11111111
//	//10000000 00000000 0000000 00000001
//	printf("%d\n", ~a);
//	return 0;
//}

//int main()
//{
//	int x = 9;
//	int y = 3;
//	int c = x ^ y;
//	//1001
//	//0011 -- 1010  -- 10
//	//00000000 00000000 00000000 00001001
//	//00000000 00000000 00000000 00000011
//	printf("%d\n", c);
//	return 0;
//}

//int main()
//{
//	int x = 12;
//	int y = 5;
//	int c = x & y;
//	//1100
//	//0101
//	//0100 -- 4
//	printf("%d\n", c);
//	return 0;
//}

//int main()
//{
//	int a = 10;
//	int b = 20;
//	int c = 0;
//	printf("交换前:%d %d\n", a, b);
//	c = a;
//	a = b;
//	b = c;
//	printf("交换后:%d %d\n", a, b);
//	return 0;
//}
// 

//int main()
//{
//	int a = 10;
//	int b = 20;
//	printf("交换前:%d %d\n", a, b);
//	a = a + b;
//	b = a - b;
//	a = a - b;
//	printf("交换后:%d %d\n", a, b);
//	return 0;
//}

//交换两个数：
//int main()
//{
//	int a = 10;
//	int b = 20;
//	printf("交换前：a=%d b=%d\n", a, b);
//	int c = a;
//	a = b;
//	b = c;
//	printf("交换后：a=%d b=%d\n", a, b);
//	return 0;
//}

//int main()
//{
//	int a = 10;
//	int b = 20;
//	printf("交换前：a=%d b=%d\n", a, b);
//	//当a b 足够大的时候，超出了整型表达的最大值，可以解决一些问题，但是可能会引发其他问题，可能
//	//存在溢出的问题
//	a = a + b;
//	b = a - b;
//	a = a - b;
//	printf("交换后：a=%d b=%d\n", a, b);
//	return 0;
//}

//int main()
//{
//	int a = 10;
//	int b = 20;
//	printf("交换前：a=%d b=%d\n", a, b);
//	a = a ^ b; //
//	b = a ^ b; // --> a ^ b ^ b -->a
//	a = a ^ b; // --> a ^ b ^ a
//	printf("交换后：a=%d b=%d\n", a, b);
//	return 0;
//}
//异或：相异位1，相同为0   a^a = 0 ;a^0 = a;
//不会存在溢出问题，不会产生进位;


//int main()
//{
//	int a = 10;
//	int b = 20;
//	printf("交换前：a=%d b=%d\n", a, b);
//	a = a ^ b;
//	b = a ^ b;  //a ^ b^ b; ----> a
//	a = a ^ b; //a ^ b ^ a ---->b
//	printf("交换后：a=%d b=%d\n", a, b);
//	return 0;
//}

//编写代码实现：求⼀个整数存储在内存中的⼆进制中1的个数。
//13 % 2 ---1
//13 / 2 ---6 %2 -- 0

//针对负数是有问题的
//int main()
//{
//	int n = 13;
//	int count = 0;
//	while (n)
//	{
//		if (n % 2 == 1)
//			count++;
//		n = n / 2;
//	}
//	printf("%d\n", count);
//	return 0;
//}

//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	int count = 0;
//	while (n)
//	{
//		if (n % 2 == 1) {
//			count++;
//		}
//		n /= 2;
//	}
//	printf("二进制中1的个数为%d\n", count);
//	return 0;
//}
// 
//任何一个数字，只要按位与1，就能得到最低位，然后右移
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	int count = 0;
//	int i = 0;
//	for (i = 0; i < 32; i++)
//	{
//		if (((n >> i) & 1) == 1)
//			count++;
//	}
//	printf("%d\n", count);
//	return 0;
//}

//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	int count = 0;
//	for (int i = 0; i < 32; i++)
//	{
//		if ((1 & (n >> i)) == 1)
//		{
//			count++;
//		}
//	}
//	printf("%d\n", count);
//	return 0;
//}

//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	int count = 0;
//	while (n)
//	{
//		n = n & (n - 1);
//		count++;
//	}
//	printf("%d\n", count);
//	return 0;
//}

//写一个代码判断 n 是否是2的次方数
//8 = 2 ^ 3
//1000
//10000
//0100
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	if ((n & (n - 1)) == 0)
//	{
//		printf("Yes!\n");
//	}
//	else
//	{
//		printf("No!\n");
//	}
//	return 0;
//}

//编写代码将13⼆进制序列的第5位修改为1，然后再改回0
//int main()
//{
//	int n = 13;
//	n |= (1 << (5 - 1));
//	//00000000 00000000 00000000 00001101
//	printf("%d\n", n);
//
//	//00000000 00000000 00000000 00001101   --13
//	//00000000 00000000 00000000 00010000    |
//	// 1 <<4
//	//00000000 00000000 00000000 00011101
//	//11111111 11111111 11111111 11101111    &
//	//00000000 00000000 00000000 00001101
//	n &= (~(1 << (5 - 1)));
//	printf("%d\n", n);
//
//	return 0;
//}

//int main()
//{
//	int n = 13;
//	n = n | (1 << 4);
//	printf("%d\n", n);
//	n = n & (~(1 << 4));
//	printf("%d\n", n);
//	return 0;
//}
//逗号表达式
//int main()
//{
//	int a = 1;
//	int b = 2;
//	int c = (a > b, a = b + 10, a, b = a + 1);
//	printf("%d\n", c);
//	return 0;
//}

//int main()
//{
//	int a, b, c, d = 0;
//	if (a = b + 1, c = a / 2, d > 0)
//	{
//		//...
//	}
//	return 0;
//}

//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6 };
//	printf("%d\n",arr[5]);
//	//3 + 5
//	//[]操作符 -- 下标引用的操作符
//	//arr , 5 是[]的两个操作数
//	return 0;
//}

//int Add(int x, int y)
//{
//	return x + y;
//}
//int main()
//{
//	printf("hehe\n");//（）函数调用操作符
//	//( )的操作数是printf,"hehe"
//	int r = Add(2, 3);
//	//( ) 的操作数是Add,2,3
//	return 0;
//}

//类型的声明
//struct Stu
//{
//	char name[20]; //名字
//	int age;      //年龄
//	float score; //成绩
//	//类型可以比作我们的图纸
//}s5, s6 ,s7;//全局变量
//
//struct Stu s4; //全局变量
//int main()
//{
//	struct Stu s1 = {"张三",20,95.5f};//局部变量
//	struct Stu s2 = { .age =18,.score=98.5f, .name="李四"};
//	struct Stu s3;
//	printf("%s\n", s1.name);//结构成员访问操作符   结构体变量名.成员名
//	return 0;
//}

//int main()
//{
//	char a = 5;
//	//00000000 00000000 00000000 00000101
//	//00000101   截断
//	char b = 126;
//	//00000000 00000000 00000000 01111110
//	//01111110
//	char c = a + b;
//	//00000101   --- 发生整型提升  --00000000 00000000 00000000 00000101
//	//01111110   --- 发生整型提升  --00000000 00000000 00000000 01111110
//	//char  --- signed char 
//	//00000000 00000000 00000000 10000011  --- 截断 -- 10000011
//	//当以%d 形式进行打印的时侯，打印的是有符号整数
//	//又会对c发生整形提升
//	//11111111 11111111 11111111 10000011 -- 内存中的补码
//	//10000000 00000000 00000000 01111101
//	printf("%d\n", c);
//	return 0;
//}

//int main()
//{
//	printf("%zd\n", sizeof(float));
//	printf("%zd\n", sizeof(double));
//	printf("%zd\n", sizeof(long double));
//	printf("%zd\n", sizeof(unsigned long int ));
//
//	return 0;
//}
//int fun()
//{
//	static int count = 1;
//	return ++count;
//	//static 出入这个函数不销毁
//	//2   3   4
//}
//
//int main()
//{
//	int answer;
//	answer = fun() - fun() * fun();
//	//无法判断谁先调用fun函数
//	printf("%d\n", answer);
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	int i = 1;
//	int ret = (++i) + (++i) + (++i);
//	printf("%d\n", ret);
//	printf("%d\n", i);
//	return 0;
//}

//int main()
//{
//	int a = 10;
//	int b = 20;
//	printf("交换前：%d %d\n", a, b);
//	a = a ^ b;
//	b = a ^ b;
//	a = a ^ b;
//	printf("交换后：%d %d\n", a, b);
//	return 0;
//}

//int Func(int arr[], int sz)
//{
//	int ret = 0;
//	for (int i = 0; i < sz; i++) {
//		ret ^= arr[i];
//	}
//	return ret;
//}
//int main()
//{
//	int arr[] = { 1,2,3,4,5,4,3,2,1};
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	int c = Func(arr, sz);
//	printf("%d\n", c);
//	return 0;
//}

//int main()
//{
//	int n = 0;
//	scanf("%d",& n);
//	
//		
//	return 0;
//}
//单身狗1   n^n =0    n^0=n
//int Func(int arr[], int sz)
//{
//	int ret = 0;
//	for (int i = 0; i < sz; i++)
//	{
//		ret ^= arr[i];
//	}
//	return ret;
//}
//int main()
//{
//	int arr[] = { 1,2,3,4,5,4,3,2,1 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	int c = Func(arr, sz);
//	printf("%d\n", c);
//	return 0;
//}

//打印整数二进制的奇数位和偶数位
//void Func(int n)
//{
//	for (int i = 30; i >= 0; i -= 2)
//	{
//		printf("%d ", (n >> i) & 1);
//	}
//	printf("\n");
//	for (int i = 31; i >= 1; i -= 2)
//	{
//		printf("%d ", (n >> i) & 1);
//	}
//}
//
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	Func(n);
//	return 0;
//}

//异或，不一样的话1,求这个二进制数1的个数即可
//int Func(int n, int m)
//{
//	int ret = n ^ m;
//	int count = 0;
//	while (ret != 0)
//	{
//		ret = ret & (ret - 1);
//		count++;
//	}
//	return count;
//}
//int main()
//{
//	int n = 0;
//	int m = 0;
//	scanf("%d %d", &n, &m);
//	int c = Func(n, m);
//	printf("%d\n", c);
//	return 0;
//}
//int Fun(int n, int m)
//{
//	int ret = n ^ m;
//	int count = 0;
//	while (ret != 0)
//	{
//		ret = ret & (ret - 1);
//		count++;
//	}
//	return count;
//}
//
//int main()
//{
//	int n = 0;
//	int m = 0;
//	scanf("%d %d", &n, &m);
//	int c = Fun(n, m);
//	printf("%d\n", c);
//	return 0;
//}

//int main()
//{
//	printf("%zd\n", sizeof(unsigned long long));
//	return 0;
//}

//#include <stdio.h>
//int i;
//int main()
//{
//    i--;
//    if (i > sizeof(i))
//    {
//        printf(">\n");
//    }
//    else
//    {
//        printf("<\n");
//    }
//    return 0;
//}